设计模式总结篇系列:适配器模式(Adapter)
网上看到不少关于适配器模式的讲解,其中对于适配器模式解释的过于专业,一时不是特别理解适配器模式到底是用来干嘛的,具体的适用场景在哪,其最精髓的地方到底在哪。
本文结合自己的理解,阐述下对适配器模式的看法。
假设系统存在一个现有的类UserInfo:
1 class UserInfo {
2
3 private Map<String, String> userBaseInfo;
4
5 public Map getUserBaseInfo() {
6 return userBaseInfo;
7 }
8
9 public void setUserBaseInfo(Map<String, String> userBaseInfo) {
10 this.userBaseInfo = userBaseInfo;
11 }
12 }
客户端可以通过如下方式set、get员工基本信息:
1 public class AdapterTest {
2
3 public static void main(String[] args) {
4
5 UserInfo oui = new UserInfo();
6 Map<String, String> inUserInfo = new HashMap<String, String>() {
7 {
8 put("name", "corn");
9 put("telNumber", "170xxxxxxxx");
10 }
11 };
12 oui.setUserBaseInfo(inUserInfo);
13
14 // 原有取得员工基本信息的方式
15 Map<String, String> outUserInfo = oui.getUserBaseInfo();
16 String name = outUserInfo.get("name");
17 String telNumber = outUserInfo.get("telNumber");
18
19 }
20 }
有一天,基于某种原因(也许你看着这种取数据的方式不太爽,也许是系统间数据交换的原因等),你需要按照如下接口的方式取数据:
目标员工接口:
1 interface UserInterface {
2
3 public String getName();
4
5 public String getTelNumber();
6
7 }
那么,现在的问题是,如何将一个既定的类转换成按照目标接口的所期望的行为形式呢?
具体怎样实现呢,可以通过如下方式进行:
1 class UserAdapter extends UserInfo implements UserInterface {
2
3 @Override
4 public String getName() {
5 return (String) super.getUserBaseInfo().get("name");
6 }
7
8 @Override
9 public String getTelNumber() {
10 return (String) super.getUserBaseInfo().get("telNumber");
11 }
12
13 }
从上面的UserAdapter类定义中我们发现,UserAdapter不仅实现了UserInterface接口,同时还继承了UserInfo类。在实现接口的getName()和getTelNumber()方法中,分别调用了UserInfo类中的相应方法并取得结果。由此可以满足需求。在上述定义中,按照UserInterface、UserInfo和UserAdapter在场景中的目的不同,可以具体划分成如下角色:
UserInterface:目标角色——目标接口,系统所期待实现的目标;
UserInfo:源角色——当前已经存在的原有的实现类,即将被适配的类;
UserAdapter:适配器角色——将原有实现装换为目标接口的实现。
简单点说,适配器模式是指:定义一个类,将一个已经存在的类,转换成目标接口所期望的行为形式。
在具体的实现过程中,又可以基于其实现层次是类层次还是对象层次,将其分为类适配器和对象适配器。如上所写的是类适配器。
对象适配器使用组合代替继承,将源角色视为适配器角色的属性:
1 class UserAdapter implements UserInterface {
2
3 private UserInfo userInfo;
4
5 public UserAdapter(){
6
7 }
8
9 public UserAdapter(UserInfo userInfo){
10 this.userInfo = userInfo;
11 }
12
13 @Override
14 public String getName() {
15 return (String) userInfo.getUserBaseInfo().get("name");
16 }
17
18 @Override
19 public String getTelNumber() {
20 return (String) userInfo.getUserBaseInfo().get("telNumber");
21 }
22
23 }
总体而言:适配器模式是指定义一个适配器类,将一个已经存在的类,转换成目标接口所期望的行为形式。同时,一般来说,基于更多的推荐使用组合而不是继承,因此,对象适配器可能使用更多。
笔者水平有限,若有错漏,欢迎指正,如果转载以及CV操作,请务必注明出处,谢谢!